# Projekt 12 Ultraschall-Verfolgungspanzer ![](media/image-20250908172315808.png) **Beschreibung** In Projekt 11 haben wir ein Hindernisvermeidungsauto gebaut. Tatsächlich müssen wir nur den Testcode ändern, um ein Hindernisvermeidungsauto in ein Verfolgungsauto umzuwandeln. In dieser Lektion werden wir einen Ultraschall-Verfolgungsroboter bauen. Der Ultraschallsensor erkennt den Abstand zwischen dem intelligenten Auto und dem Hindernis, um den Panzerwagen zu bewegen. **Die spezifische Logik des Ultraschall-Verfolgungsroboters ist wie folgt dargestellt:** | **Erkennung** | **Gemessener Abstand zu vorderen Hindernissen** | **Abstand (Einheit: cm)** | | ------------- | ----------------------------------------------- | ------------------------- | | Einstellungen | Servo-Winkel 90° | | | | 8X16 LED-Panel zeigt das Symbol "V" | | | Wenn | 20≤ Abstand ≤60 | | | Status | Vorwärts fahren (PWM auf 200 setzen) | | | Wenn | 10\= 20 && distance <= 60) // Bereich zum Vorwärtsfahren { Car_front(); } else if (distance > 10 && distance < 20) // Bereich zum Stoppen { Car_Stop(); } else if (distance <= 10) // Bereich zum Rückwärtsfahren { Car_back(); } else // Andere Situationen, stoppen { Car_Stop(); } } /***********Funktion für Motorlauf****************/ void Car_front() { digitalWrite(MR_Ctrl,LOW); analogWrite(MR_PWM,200); digitalWrite(ML_Ctrl,LOW); analogWrite(ML_PWM,200); } void Car_back() { digitalWrite(MR_Ctrl,HIGH); analogWrite(MR_PWM,200); digitalWrite(ML_Ctrl,HIGH); analogWrite(ML_PWM,200); } void Car_left() { digitalWrite(MR_Ctrl,LOW); analogWrite(MR_PWM,200); digitalWrite(ML_Ctrl,HIGH); analogWrite(ML_PWM,200); } void Car_right() { digitalWrite(MR_Ctrl,HIGH); analogWrite(MR_PWM,200); digitalWrite(ML_Ctrl,LOW); analogWrite(ML_PWM,200); } void Car_Stop() { digitalWrite(MR_Ctrl,LOW); analogWrite(MR_PWM,0); digitalWrite(ML_Ctrl,LOW); analogWrite(ML_PWM,0); } /******************Punktmatrix********************/ // Funktion für Punktmatrix-Anzeige void matrix_display(unsigned char matrix_value[]) { IIC_start(); // Funktion aufrufen, die die Datenübertragung startet IIC_send(0xc0); // Adresse wählen for(int i = 0;i < 16;i++) // Musterdaten haben 16 Bits { IIC_send(matrix_value[i]); // Daten zur Übertragung von Mustern } IIC_end(); // Datenübertragung beenden IIC_start(); IIC_send(0x8A); // Pulsbreite 4/16 wählen, Anzeige steuern IIC_end(); } // Bedingung zum Starten der Datenübertragung void IIC_start() { digitalWrite(SCL_Pin,HIGH); delayMicroseconds(3); digitalWrite(SDA_Pin,HIGH); delayMicroseconds(3); digitalWrite(SDA_Pin,LOW); delayMicroseconds(3); } // Daten übertragen void IIC_send(unsigned char send_data) { for(char i = 0;i < 8;i++) // Jedes Byte hat 8 Bits { digitalWrite(SCL_Pin,LOW); // Taktsignal-Pin SCL herunterziehen, um die Signale von SDA zu ändern delayMicroseconds(3); if(send_data & 0x01) // Hohe und niedrige Pegel von SDA_Pin gemäß 1 oder 0 jedes Bits setzen { digitalWrite(SDA_Pin,HIGH); } else { digitalWrite(SDA_Pin,LOW); } delayMicroseconds(3); digitalWrite(SCL_Pin,HIGH); // Taktsignal-Pin SCL hochziehen, um die Datenübertragung zu stoppen delayMicroseconds(3); send_data = send_data >> 1; // Bit für Bit erkennen, daher die Daten um eins nach rechts verschieben } } // Zeichen für das Ende der Datenübertragung void IIC_end() { digitalWrite(SCL_Pin,LOW); delayMicroseconds(3); digitalWrite(SDA_Pin,LOW); delayMicroseconds(3); digitalWrite(SCL_Pin,HIGH); delayMicroseconds(3); digitalWrite(SDA_Pin,HIGH); delayMicroseconds(3); } /***************Ende Punktmatrix-Anzeige******************/ // Funktion zur Servo-Steuerung void procedure(int myangle) { for (int i = 0; i <= 50; i = i + (1)) { pulsewidth = myangle * 11 + 500; digitalWrite(servoPin,HIGH); delayMicroseconds(pulsewidth); digitalWrite(servoPin,LOW); delay((20 - pulsewidth / 1000)); }} // Funktion zur Steuerung der Ultraschallsensorfunktion, die das Ultraschallsignal steuert float checkdistance() { digitalWrite(Trig, LOW); delayMicroseconds(2); digitalWrite(Trig, HIGH); delayMicroseconds(10); digitalWrite(Trig, LOW); float distance = pulseIn(Echo, HIGH) / 58.20; // 58.20, das heißt, 2*29.1=58.2 delay(10); return distance; } //**************************************************************** ``` **Testergebnis** Code erfolgreich hochgeladen, DIP-Schalter ist auf das rechte Ende gestellt, das Servo dreht sich auf 90°, "V" wird auf dem 8X16 LED-Panel angezeigt und das intelligente Auto bewegt sich mit dem Hindernis.